Julia 提供了大量的流程控制构件:
复合表达式:begin 和 ;。条件表达式:if-elseif-else 和 ?: (三元运算符)。短路求值:逻辑运算符 &&(与)和 ||(或),以及链式比较。重复执行:循环:while 和 for。异常处理:try-catch、error 和 throw。Task(协程):yieldto。前五个流程控制机制是高级编程语言的标准。Task 不是那么的标准:它提供了非局部的流程控制,这使得在暂时挂起的计算任务之间进行切换成为可能。这是一个功能强大的构件:Julia 中的异常处理和协同多任务都是通过 Task 实现的。虽然日常编程并不需要直接使用 Task,但某些问题用 Task 处理会更加简单。
复合表达式有时一个表达式能够有序地计算若干子表达式,并返回最后一个子表达式的值作为它的值是很方便的。Julia 有两个组件来完成这个: begin 代码块 和 ; 链。这两个复合表达式组件的值都是最后一个子表达式的值。下面是一个 begin 代码块的例子:
julia> z = beginx = 1y = 2x + yend3因为这些是非常简短的表达式,它们可以简单地被放到一行里,这也是 ; 链的由来:
julia> z = (x = 1; y = 2; x + y)3这个语法在定义简洁的单行函数的时候特别有用,参见函数。尽管很典型,但是并不要求 begin 代码块是多行的,或者 ; 链是单行的:
julia> begin x = 1; y = 2; x + y end3julia> (x = 1;y = 2;x + y)3条件表达式条件表达式(Conditional evaluation)可以根据布尔表达式的值,让部分代码被执行或者不被执行。下面是对 if-elseif-else 条件语法的分析:
if x < yprintln("x is less than y")elseif x > yprintln("x is greater than y")elseprintln("x is equal to y")end如果表达式 x < y 是 true,那么对应的代码块会被执行;否则判断条件表达式 x > y,如果它是 true,则执行对应的代码块;如果没有表达式是 true,则执行 else 代码块。下面是一个例子:
julia> function test(x, y)if x < yprintln("x is less than y")elseif x > yprintln("x is greater than y")elseprintln("x is equal to y")endendtest (generic function with 1 method)julia> test(1, 2)x is less than yjulia> test(2, 1)x is greater than yjulia> test(1, 1)x is equal to yelseif 和 else 代码块是可选的,并且可以使用任意多个 elseif 代码块。 if-elseif-else 组件中的第一个条件表达式为 true 时,其他条件表达式才会被执行,当对应的代码块被执行后,其余的表达式或者代码块将不会被执行。
if 代码块是"有渗漏的",也就是说它们不会引入局部作用域。这意味着在 if 语句中新定义的变量依然可以在 if 代码块之后使用,尽管这些变量没有在 if 语句之前定义过。所以,我们可以将上面的 test 函数定义为
julia> function test(x,y)if x < yrelation = "less than"elseif x == yrelation = "equal to"elserelation = "greater than"endprintln("x is ", relation, " y.")endtest (generic function with 1 method)julia> test(2, 1)x is greater than y.变量 relation 是在 if 代码块内部